importmath,functoolsdeffindmodulus(outputs):temp=[]foridxinrange(0,len(outputs)-1):temp.append(outputs[idx+1]-outputs[idx])temp2=[]foridxinrange(0,len(temp)-2):temp2.append(abs((temp[idx+2]*temp[idx])-temp[idx+1]**2))returnfunctools.reduce(math.gcd,temp2)deffindmult(x0,x1,x2,mod):temp=x1-x2temp2=pow(x0-x1,-1,mod)return(temp*temp2)%moddeffindinc(x0,x1,a,mod):# x1 = x0*a + b
# x1 - (x0*a) = b
return(x1-(x0*a))%moddeffindperoid(lcg):first=lcg.next()counter=0whilefirst!=lcg.next():counter+=1ifcounter%0xFFFFFF==0:print(counter)print(f"Found Period: {counter}")classLCG(object):"""docstring for LCG"""def__init__(self,seed=1337,a=1103515245,b=12345,c=0x7FFFFFFF):super(LCG,self).__init__()self.state=seedself.a=aself.b=bself.c=cdefnext(self):# seed = (seed * A + B) % C
self.state=(self.state*self.a+self.b)%self.creturnself.statedefint_32(self,number):returnint(0xFFFFFFFF&number)if__name__=='__main__':lcg=LCG()#### Computing the Paramaters
seeds=[]for_inrange(10):seeds.append(lcg.next())#Recover Mod
found_mod=findmodulus(seeds)print(f"Mod: {found_mod}")#Recover Mult a
found_a=findmult(seeds[0],seeds[1],seeds[2],found_mod)print(f"A: {found_a}")#Recover add b
found_b=findinc(seeds[0],seeds[1],found_a,found_mod)print(f"B: {found_b}")assertfound_mod==lcg.cassertfound_a==lcg.aassertfound_b==lcg.b